package com.crm.controller;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.crm.entity.Role;
import com.crm.entity.User;
import com.crm.entity.UserRole;
import com.crm.service.RoleService;
import com.crm.service.UserRoleService;
import com.crm.util.PageUtil;
import com.crm.util.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author crm
 * @since 2020-06-05
 */
@RestController//标注当前类是controller类，controller用 于处理客户端请求，加Rest表示当前类的所有方法都返回json数据，不走视图
public class RoleController {
    @Autowired//设置注入方式，spring 自动在spring容器找到叫这个名或这个类型的对象，赋给当前属性，controller调 用service
    private RoleService roleService;//role的业务层父接口
    @Resource//设置注入方式，spring 自动在spring容器找到叫这个名或这个类型的对象，赋给当前属性，controller调 用service
    private UserRoleService userRoleService;//userRole的业务层父接口
    @RequestMapping("/getRolesAll")//客户端请求地址
    public Object GetRolesAll(){//返回值和方法名，Object表示可以返回任何对象，要父给子
        return roleService.list();//调用mybatis Plus的内置service层方法list（）查全部数据，返回给前端ajax的请求，list也就是res
    }
    @RequestMapping("/getRolesByUserIdLayUI")
    public Object getRolesByUserIdLayUI(Integer uid){//接收请求中名字叫uid的数据，并转换成Integer类型
        List<Role> list=roleService.GetRolesByUserIdLayUI(uid);//调用service层的方法，返回根据用户id（uid）查到的角色
        Map<String,Object> map=new HashMap<String,Object>();//封装layui的table要的数据格式
        map.put("code",0);
        map.put("msg","");
        map.put("data",list);
        map.put("count",list.size());//因为不考虑分页，所以直接传list的长度即可，不用单独查个数
        return map;
    }

    @RequestMapping("getRolesLayUI")// 客户端请求地址
    public Object getRolesLayUI(PageUtil p,Role role) {//返 回值和方法名，object表示可以返回任何对象，因为object是任何对象的父对象，要父给子没问匙
        Page<Role> page = new Page<Role>(p.getPage(), p.getLimit());
        // 封装查询条件
        QueryWrapper<Role> queryWrapper = new QueryWrapper<Role>();
        if(role.getRname()!=null && !role.getRname().isEmpty()) {
            queryWrapper.like("rname",role.getRname());
        }
        page = roleService.page(page, queryWrapper);
        return new Result(0, "", page.getRecords(), page.getTotal());
    }
    @RequestMapping("createRole")// 客户端请求地址
    public Object createRole(Role role) {//返 回值和方法名，object表示可以返回任何对象，因为object是任何对象的父对象，要父给子没问匙

        Role rname = roleService.getOne(new QueryWrapper<Role>().eq("rname", role.getRname()));//使用mybatis plus条件构造器queryWrapper，根据 entity 条件，查询一条记录
        if (rname != null) {
            return new Result(1, "添加失败，该名称已存在！");//把查到的结果数据，返回给前端ajax的请求
        }

        boolean i = roleService.save(role);
        if (i == true) {
            return new Result(0, "添加成功");//把查到的结果数据，返回给前端ajax的请求
        }
        return new Result(1, "添加失败");//把查到的结果数据，返回给前端ajax的请求
    }

    @RequestMapping("updateRole")// 客户端请求地址
    public Object updateRole(Role role) {//返 回值和方法名，object表示可以返回任何对象，因为object是任何对象的父对象，要父给子没问匙
        Role rname = roleService.getOne(new QueryWrapper<Role>().eq("rname", role.getRname()));//使用mybatis plus条件构造器queryWrapper，根据 entity 条件，查询一条记录
        if (rname != null && !rname.getRid().equals(role.getRid())) {
            return new Result(1, "修改失败，该名称已存在！");//把查到的结果数据，返回给前端ajax的请求
        }
        boolean bl = roleService.updateById(role);
        if (bl == true) {
            return new Result(0, "修改成功！");//把查到的结果数据，返回给前端ajax的请求
        }
        return new Result(1, "修改失败！");//把查到的结果数据，返回给前端ajax的请求
    }

    @RequestMapping("deleteRole")// 客户端请求地址
    public Object deleteRole(Integer rid) {//返 回值和方法名，object表示可以返回任何对象，因为object是任何对象的父对象，要父给子没问匙
        // 删除前先判断该部门下是否有数据（员工）
        List<UserRole> list = userRoleService.list(new QueryWrapper<UserRole>().eq("rid", rid));//使用mybatis plus条件构造器queryWrapper，根据 entity 条件，查询一条记录
        if (!list.isEmpty()) {
            return new Result(1, "该角色下有数据，删除失败！");//把查到的结果数据，返回给前端ajax的请求
        }
        boolean bl = roleService.removeById(rid);
        if (bl) {
            return new Result(0, "删除成功！");//把查到的结果数据，返回给前端ajax的请求
        }
        return new Result(1, "删除失败！");//把查到的结果数据，返回给前端ajax的请求
    }


}
